package com.homework.ch08;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author yang
 * @date 2024-03-28
 */
public class BeanUtil02 {
    /**
     * 设置何意对象的属性值的方法
     * @param bean
     * @param propertyName
     * @param value
     * @throws Exception
     */
    public static void setProperty(Object bean, String propertyName, Object value) throws Exception {
        //1、获取 Java Bean 对象的 BeanInfo 对象 - 排除父类
        BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(), Object.class);

        //2、获取属性描述器列表
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

        //3、循环遍历所有的属性描述器 - 匹配设置的属性，找到 setter 方法 - 调用赋值
        for(PropertyDescriptor property : propertyDescriptors){
            if(property.getName().equals(propertyName)){
                Method writeMethod = property.getWriteMethod();
                writeMethod.invoke(bean, value);
                break;
            }
        }
    }

    /**
     * 获取任意对象的属性值的方法
     * @param bean
     * @param propertyName
     * @return
     */
    public static Object getProperty(Object bean, String propertyName) throws Exception{
        //1、获取 Java Bean 对象的 BeanInfo 对象 - 排除父类
        BeanInfo beanInfo = Introspector.getBeanInfo(bean.getClass(), Object.class);

        //2、获取属性描述器列表
        PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();

        //3、循环遍历所有的属性描述器 - 匹配设置的属性，找到 getter 方法 - 调用赋值
        for(PropertyDescriptor property : propertyDescriptors){
            if(property.getName().equals(propertyName)){
                Method readMethod = property.getReadMethod();
                return readMethod.invoke(bean);
            }
        }
        return null;
    }
}
